package com.operator.Activitys.activity;

import android.os.Handler;
import android.os.Message;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.utils.CheckUtils;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.ToastUtils;
import com.zhy.autolayout.AutoLinearLayout;
import com.zhy.autolayout.AutoRelativeLayout;

import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.io.IOException;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * 项目名称：金泽云 手机app
 * 类描述：忘记密码页面
 * 创建人：张飞祥
 * 创建时间：2018/6/15 17:15
 * 修改人：张飞祥
 * 修改时间：2018/6/15 17:15
 * 修改备注：
 */
public class PwdUsedActivity extends BaseActivity {

    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //标题总布局
    @Bind(R.id.app_bar_layout)
    AutoRelativeLayout appBarLayout;

    //TODO 获取验证码页面
    //手机号
    @Bind(R.id.et_pwd_phone)
    EditText etPwdPhone;
    //验证码
    @Bind(R.id.et_pwd_code)
    EditText etPwdCode;
    //获取验证码按钮
    @Bind(R.id.btn_pwd_code)
    Button btnPwdCode;
    //验证码 总布局
    @Bind(R.id.layout_pwd_code)
    AutoLinearLayout layoutPwdCode;

    //TODO 完成总布局
    @Bind(R.id.layout_set_up_pwd)
    AutoLinearLayout layoutSetUpPwd;
    //新密码
    @Bind(R.id.et_pwd_new)
    EditText etPwdNew;
    //确认新密码
    @Bind(R.id.et_pwd_confirm)
    EditText etPwdConfirm;


    //获取验证码等待时间
    private int mTimeSecond = 60; // 总秒数
    //获取输入的验证码
    private String mPwdVcode = "";

    //TODO 初始化网络请求
    public UserManager mApiManager;
    //内存中用户实体
    protected User mACacheUser = null;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_pwd_used);
        //网络请求接口 常驻方法
        mApiManager = mApiManager.getUserApiManager(this,this.getTaskId());
        //获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);
    }

    @Override
    protected void initData() {
        //设置标题
        tvTitle.setText("忘记密码");
        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //设置状态栏 背景颜色
        appBarLayout.setBackgroundResource(R.color.color_bg_blue);

        if(mACacheUser!=null)
            //设置 找回密码的手机号码
            etPwdPhone.setText(mACacheUser.getMobile());
    }

    /**
     * 按钮点击事件
     *
     * @param view
     */
    @OnClick({R.id.iv_return, R.id.btn_pwd_complete,R.id.btn_pwd_code, R.id.btn_pwd_next})
    public void onClick(View view) {
        switch (view.getId()) {

            case R.id.iv_return:        //返回按钮
                finish();
                break;

            case R.id.btn_pwd_code:     //获取验证码
                //获取当前 手机号码
                String mobile = etPwdPhone.getText().toString();
                /**
                 * 1.判断手机号码非空
                 * 2.判断手机号码格式
                 * 3.开始获取验证码网络请求
                 */
                if (mobile==null || mobile.equals(""))
                    ToastUtils.showShort(PwdUsedActivity.this,"请输入手机号！");
                else if (!CheckUtils.isMobile(mobile))
                    ToastUtils.showShort(this, "手机号码格式不正确！");
                else
                    //开始 网络请求
                    initHttpPushVCode(mobile);
                break;

            case R.id.btn_pwd_next:     //下一步
                //验证码
                mPwdVcode = etPwdCode.getText().toString();
                /**
                 * 1.判断验证码非空
                 */
                if (!mPwdVcode.equals("")) {
                    //显示重置登录密码页面
                    layoutSetUpPwd.setVisibility(View.VISIBLE);
                    //隐藏获取验证码页面
                    layoutPwdCode.setVisibility(View.GONE);
                }else {
                    ToastUtils.showShort(this, "请填写验证码！");
                }
                break;

            case R.id.btn_pwd_complete: //完成
                //获取当前 手机号码
                String myMobile = etPwdPhone.getText().toString();
                //新密码
                String newPwd = etPwdNew.getText().toString();
                //确认新密码
                String confirmNewPwd = etPwdConfirm.getText().toString();

                /**
                 * 1.判断每个字段非空
                 * 2.判断两次密码是否一致
                 * 3.判断新密码格式是否正确
                 * 4.开始网络请求
                 */
                if (newPwd.equals("") || confirmNewPwd.equals("")) {
                    ToastUtils.showShort(this, "请您认真填写，内容不许为空！");
                }  else if (!newPwd.equals(confirmNewPwd)) {
                    ToastUtils.showShort(this, "两次密码输入不一致！");
                }else if (!CheckUtils.isPassword(newPwd)) {
                    ToastUtils.showShort(this, "新密码格式不正确！");
                }else{
                    initShowTimeDialog("正在提交，请稍后....", this);
                    //获取 sessionId
                    String sessionId = mACache.getAsString(Constant.CACHE_SESSION_ID);
                    //开始网络请求
                    mApiManager.userUsedLoginPwd(sessionId,mPwdVcode,myMobile,newPwd);
                }
                break;
        }
    }

    /**
     * 网络请求 获取 短信 验证码
     */
    private void initHttpPushVCode(String mobile) {
        //清空短信验证码输入框
        etPwdCode.setText("");
        //清空短信验证码 变量
        mPwdVcode = "";
        //开启倒计时线程
        mTimeHandler.postDelayed(mTimeRunnable, 1000);
        //设置按钮文字
        btnPwdCode.setText(mTimeSecond + "s");
        //设置按钮不可以点击
        btnPwdCode.setEnabled(false);
        //设置 按钮背景 为 灰色
        btnPwdCode.setBackgroundResource(R.drawable.bg_public_round_gray);

        /**
         * 创建 okHttp3 请求方式
         */
        FormBody.Builder params = new FormBody.Builder();
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(Constant.HTTP_FORGET_PWD_URL + mobile)
                .post(params.build())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                /**
                 * 创建一条 message
                 */
                Message msg = Message.obtain();
                msg.what = Constant.HANDLE_REGISTER_CODE_ERROR;
                mTimeHandler.sendMessageDelayed(msg,5000);
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {

                /**
                 * 创建一条 message
                 */
                Message msg = Message.obtain();
                msg.obj = response.body().string();
                msg.what = Constant.HANDLE_REGISTER_CODE;
                mTimeHandler.sendMessageDelayed(msg,5000);

                /**
                 * 获取session的操作，session放在cookie头，且取出后含有“；”，取出后为下面的 s （也就是sessionId）
                 */
                //获取 验证码 请求头
                Headers headers = response.headers();
                //获取 请求下的 cookie
                List<String> cookies = headers.values("Set-Cookie");
                //TODO 根据 cookie 获取 准确的 sessionId
                String sessionId = cookies.get(0).substring(0, cookies.get(0).indexOf(";"));
                //保存 sessionId 到本地
                mACache.put(Constant.CACHE_SESSION_ID, sessionId);
            }
        });
    }

    /**
     * 验证码请求 倒计时
     */
    private Runnable mTimeRunnable = new Runnable() {
        @Override
        public void run() {
            //倒计时 自 - 1
            mTimeSecond--;
            //设置按钮文字
            btnPwdCode.setText(mTimeSecond < 10 ? "0" + mTimeSecond + "s" : mTimeSecond + "s");
            //TODO 是否到 做后 1s 了
            if (mTimeSecond == 0) {
                //设置按钮文字
                btnPwdCode.setText("重新获取");
                //设置按钮可以点击
                btnPwdCode.setEnabled(true);
                //设置 按钮背景 为 彩色
                btnPwdCode.setBackgroundResource(R.drawable.btn_public_violet);
                //初始化秒数
                mTimeSecond = 60;
            } else {
                mTimeHandler.postDelayed(this, 1000);
            }
        }
    };

    /**
     * 异步加载 验证码
     */
    public Handler mTimeHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                //TODO 加载网络成功进行UI的更新
                case Constant.HANDLE_REGISTER_CODE:
                    /**
                     * 获取 网络 数据
                     */
                    //开始解析 转换为 实体数据
                    State state = new Gson().fromJson(msg.obj.toString(), State.class);
                    //重置获取验证码线程
                    setResetVcodeThread();
                    //弹出相应的提示
                    ToastUtils.showShort(PwdUsedActivity.this, state.getMsg());
                    break;
                //TODO 加载网络失败
                case Constant.HANDLE_REGISTER_CODE_ERROR:
                    //重置获取验证码线程
                    setResetVcodeThread();
                    //弹出相应的提示
                    ToastUtils.showShort(PwdUsedActivity.this, "网络连接不稳定，请稍后在试！！！");
                    break;
            }
        }
    };

    /**
     * 重置 获取验证码线程
     */
    private void setResetVcodeThread(){
        //销毁线程
        mTimeHandler.removeCallbacks(mTimeRunnable);
        //设置按钮文字
        btnPwdCode.setText("获取验证码");
        //设置按钮可以点击
        btnPwdCode.setEnabled(true);
        //设置 按钮背景 为 彩色
        btnPwdCode.setBackgroundResource(R.drawable.btn_public_violet);
        //初始化秒数
        mTimeSecond = 60;
    }

    /**
     * 网络请求 忘记登录密码 提交 报错
     */
    @Subscriber(tag = Constant.BUS_MY_USED_LOGIN_PWD_ERROR, mode = ThreadMode.MAIN)
    public void initUpdateLoginPwdError(String strError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                timeDialog.dismiss();
                //弹出相应的提示
                ToastUtils.showShort(PwdUsedActivity.this,"网络连接不稳定，请稍后重试！！！");
            }
        }, 1000);
    }

    /**
     * 网络请求 忘记登录密码 提交
     */
    @Subscriber(tag = Constant.BUS_MY_USED_LOGIN_PWD, mode = ThreadMode.MAIN)
    public void initUpdateLoginPwd(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //隐藏dialog
                timeDialog.dismiss();
                //TODO 网络请求业务逻辑判断
                if (state.getState().equals("1")) {
                    //提示 dialog
                    MaterialDialog mMsgDialog = new MaterialDialog.Builder(PwdUsedActivity.this)
                            .title("提交成功")
                            .content("恭喜您，新的密码已修改成功，请重新登录吧！")
                            .positiveText("立即登录")
                            .onPositive(new MaterialDialog.SingleButtonCallback() {
                                @Override
                                public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                    //销毁当前页面
                                    finish();
                                }
                            }).show();
                    // 设置点击屏幕Dialog不消失
                    mMsgDialog.setCanceledOnTouchOutside(false);
                    //取消Back键监听
                    mMsgDialog.setCancelable(false);
                }else{
                    //弹出相应的提示
                    ToastUtils.showShort(PwdUsedActivity.this, state.getMsg());
                }
            }
        }, 1000);
    }
}
